home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockDateFormatter.js < prev    next >
Text File  |  2007-10-18  |  8KB  |  273 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. //
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. //
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. //
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. //
  17. // END FLOCK GPL
  18. //
  19.  
  20. const DF_CONTRACTID = '@flock.com/date-formatter;1';
  21. const DF_CLASSID    = Components.ID('3c4c0b89-82e0-4d08-938c-6d5ede31a784');
  22. const DF_CLASSNAME  = 'Flock Date Formatter';
  23.  
  24. const URI_DF_PROPERTIES = 'chrome://flock/locale/common/flockDateFormatter.properties';
  25.  
  26.  
  27. const Cc = Components.classes;
  28. const Ci = Components.interfaces;
  29. const Cr = Components.results;
  30.  
  31.  
  32. function getObserverService() {
  33.   return Cc['@mozilla.org/observer-service;1']
  34.     .getService(Ci.nsIObserverService);
  35. }
  36.  
  37.  
  38. const MSECS_PER_DAY = 24 * 60 * 60 * 1000;
  39.  
  40. function DateFormatter() {
  41.   var obs = getObserverService();
  42.   obs.addObserver(this, 'profile-after-change', false);
  43. }
  44.  
  45. DateFormatter.prototype = {
  46.   _start: function DF__start() {
  47.     var sbs = Cc['@mozilla.org/intl/stringbundle;1']
  48.       .getService(Ci.nsIStringBundleService);
  49.     var bundle = sbs.createBundle(URI_DF_PROPERTIES);
  50.  
  51.     this._pureDateTimeFormat = bundle.GetStringFromName("time");
  52.     this._reallyShortFormat = bundle.GetStringFromName("time.veryshort");
  53.     this._mediumShortFormat = bundle.GetStringFromName("time.medshort");
  54.     this._daysAgoFormat = bundle.GetStringFromName("daysAgo");
  55.     this._hoursAgoFormat = bundle.GetStringFromName("hoursAgo");
  56.     this._momentAgoFormat = bundle.GetStringFromName("momentAgo");
  57.     this._minutesAgoFormat = bundle.GetStringFromName("minutesAgo");
  58.     this._weeksAgoFormat = bundle.GetStringFromName("weeksAgo");
  59.     this._yearsAgoFormat = bundle.GetStringFromName("yearsAgo");
  60.  
  61.     for each (var t in ['tomorrow', 'today', 'yesterday']) {
  62.       var tstr = bundle.GetStringFromName(t);
  63.  
  64.       this['_' + t + 'String'] = tstr;
  65.  
  66.       this['_' + t + 'DateTimeFormat'] =
  67.         bundle.formatStringFromName('timeShort', [tstr], 1);
  68.     }
  69.   },
  70.  
  71.   observe: function DF_observe(subject, topic, state) {
  72.     var obs = getObserverService();
  73.  
  74.     switch (topic) {
  75.       case 'profile-after-change':
  76.         obs.removeObserver(this, 'profile-after-change');
  77.         this._start();
  78.         break;
  79.     }
  80.   },
  81.  
  82.   getTimeString: function DF_getTimeString(time) {
  83.     var date = new Date(time);
  84.     return date.toLocaleFormat('%I:%M %p').replace(/^0/, '');
  85.   },
  86.   getDateString: function DF_getDateString(time) {
  87.     var date = new Date(time);
  88.  
  89.     var now = new Date();
  90.     var now_date = new Date(now.toDateString());
  91.  
  92.     if (date.getTime() >= (now_date.getTime() + 2 * MSECS_PER_DAY))
  93.       return date.toLocaleFormat('%A, %B %d, %Y').replace(' 0', ' ');
  94.     else if (date.getTime() >= (now_date.getTime() + MSECS_PER_DAY))
  95.       return this._tomorrowString;
  96.     else if (date.getTime() >= now_date.getTime())
  97.       return this._todayString;
  98.     else if (date.getTime() >= (now_date.getTime() - MSECS_PER_DAY))
  99.       return this._yesterdayString;
  100.     else
  101.       return date.toLocaleFormat('%A, %B %d, %Y').replace(' 0', ' ');
  102.   },
  103.  
  104.   getDateTimeString: function DF_getDateTimeString(time) {
  105.     var date = new Date(time);
  106.     var now = new Date();
  107.  
  108.     return this._getDateTimeStringHelper(date, now, this._pureDateTimeFormat);
  109.   },
  110.  
  111.   getShortDateTimeString: function DF_getShortDateTimeString(time) {
  112.     var date = new Date(time);
  113.     var now = new Date();
  114.  
  115.     var format;
  116.     if (date.getYear() == now.getYear())
  117.       format = this._reallyShortFormat;
  118.     else
  119.       format = this._mediumShortFormat;
  120.  
  121.     return this._getDateTimeStringHelper(date, now, format);
  122.   },
  123.  
  124.   getFriendlyLastDate: function(lastUpdated) {
  125.     var now = new Date();
  126.     var updatedDate = Date.now() - lastUpdated;
  127.  
  128.     var secondsSince = updatedDate/1000;
  129.     var minutesSince = secondsSince / 60;
  130.     var hoursSince = minutesSince / 60;
  131.     var daysSince = hoursSince / 24;
  132.     var weeksSince = daysSince / 7;
  133.     var yearsSince = daysSince / 365;
  134.  
  135.     if (yearsSince >= 1) {
  136.       return yearsSince.toFixed(0) + this._yearsAgoFormat;
  137.     } else if (daysSince > 13) {
  138.       return weeksSince.toFixed(0) + this._weeksAgoFormat;
  139.     } else if (daysSince >= 1) {
  140.       return daysSince.toFixed(0) + this._daysAgoFormat;
  141.     } else if (hoursSince >= 1) {
  142.       return hoursSince.toFixed(0) + this._hoursAgoFormat;
  143.     } else if (minutesSince >= 1) {
  144.       return minutesSince.toFixed(0) + this._minutesAgoFormat;
  145.     }
  146.  
  147.     // Invalid value check 
  148.     if (minutesSince < 0) { 
  149.       // Under/Overflow 
  150.       return ""; 
  151.     } 
  152.  
  153.     return this._momentAgoFormat;
  154.   },
  155.  
  156.   _getDateTimeStringHelper: function DF_getDateTimeStringHelper(date, now,
  157.                                                                 format) {
  158.     var datetime;
  159.     var now_date = new Date(now.toDateString());
  160.  
  161.     if (date.getTime() >= (now_date.getTime() + 2 * MSECS_PER_DAY))
  162.       datetime = date.toLocaleFormat(format);
  163.     else if (date.getTime() >= (now_date.getTime() + MSECS_PER_DAY))
  164.       datetime = date.toLocaleFormat(this._tomorrowDateTimeFormat);
  165.     else if (date.getTime() >= now_date.getTime())
  166.       datetime = date.toLocaleFormat(this._todayDateTimeFormat);
  167.     else if (date.getTime() >= (now_date.getTime() - MSECS_PER_DAY))
  168.       datetime = date.toLocaleFormat(this._yesterdayDateTimeFormat);
  169.     else
  170.       datetime = date.toLocaleFormat(format);
  171.  
  172.     return datetime.replace(/ 0/g, ' ');
  173.   },
  174.  
  175.   getInterfaces: function DF_getInterfaces(countRef) {
  176.     var interfaces =
  177.         [Ci.flockIDateFormatter, Ci.nsIObserver,
  178.          Ci.nsIClassInfo, Ci.nsISupports];
  179.     countRef.value = interfaces.length;
  180.     return interfaces;
  181.   },
  182.   getHelperForLanguage: function DF_getHelperForLanguage(language) {
  183.     return null;
  184.   },
  185.   contractID: DF_CONTRACTID,
  186.   classDescription: DF_CLASSNAME,
  187.   classID: DF_CLASSID,
  188.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  189.   flags: Ci.nsIClassInfo.SINGLETON,
  190.  
  191.   QueryInterface: function DF_QueryInterface(iid) {
  192.     if (iid.equals(Ci.flockIDateFormatter) ||
  193.         iid.equals(Ci.nsIObserver) ||
  194.         iid.equals(Ci.nsIClassInfo) ||
  195.         iid.equals(Ci.nsISupports))
  196.       return this;
  197.     throw Cr.NS_ERROR_NO_INTERFACE;
  198.   }
  199. }
  200.  
  201.  
  202. function GenericComponentFactory(ctor) {
  203.   this._ctor = ctor;
  204. }
  205.  
  206. GenericComponentFactory.prototype = {
  207.  
  208.   _ctor: null,
  209.  
  210.   // nsIFactory
  211.   createInstance: function(outer, iid) {
  212.     if (outer != null)
  213.       throw Cr.NS_ERROR_NO_AGGREGATION;
  214.     return (new this._ctor()).QueryInterface(iid);
  215.   },
  216.  
  217.   // nsISupports
  218.   QueryInterface: function(iid) {
  219.     if (iid.equals(Ci.nsIFactory) ||
  220.         iid.equals(Ci.nsISupports))
  221.       return this;
  222.     throw Cr.NS_ERROR_NO_INTERFACE;
  223.   },
  224. };
  225.  
  226. var Module = {
  227.   QueryInterface: function(iid) {
  228.     if (iid.equals(Ci.nsIModule) ||
  229.         iid.equals(Ci.nsISupports))
  230.       return this;
  231.  
  232.     throw Cr.NS_ERROR_NO_INTERFACE;
  233.   },
  234.  
  235.   getClassObject: function(cm, cid, iid) {
  236.     if (!iid.equals(Ci.nsIFactory))
  237.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  238.  
  239.     if (cid.equals(DF_CLASSID))
  240.       return new GenericComponentFactory(DateFormatter);
  241.  
  242.     throw Cr.NS_ERROR_NO_INTERFACE;
  243.   },
  244.  
  245.   registerSelf: function(cm, file, location, type) {
  246.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  247.     cr.registerFactoryLocation(DF_CLASSID,
  248.                                DF_CLASSNAME,
  249.                                DF_CONTRACTID,
  250.                                file, location, type);
  251.  
  252.     var catman = Cc['@mozilla.org/categorymanager;1']
  253.       .getService(Ci.nsICategoryManager);
  254.     catman.addCategoryEntry('app-startup', DF_CLASSNAME,
  255.                             'service,' + DF_CONTRACTID,
  256.                             true, true);
  257.   },
  258.  
  259.   unregisterSelf: function(cm, location, type) {
  260.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  261.     cr.unregisterFactoryLocation(DF_CLASSID, location);
  262.   },
  263.  
  264.   canUnload: function(cm) {
  265.     return true;
  266.   },
  267. };
  268.  
  269. function NSGetModule(compMgr, fileSpec)
  270. {
  271.   return Module;
  272. }
  273.